const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');

const Schema = mongoose.Schema;
const ObjectId = Schema.Types.ObjectId;
const SALT_WORK_FACTOR = 10;


// 创建UserSchema模型
const userSchema = new Schema({
  userId: {type:ObjectId},
  userName: {unique:true, type:String},   // unique，用户名是否不能重复
  password: String,   // 这种是简写，等于{type:String}
  createAt: {type:Date, default:Date.now()},
  lastLoginAt: {type:Date, default:Date.now()},
});

userSchema.pre('save', function(next){  // next，下一步。可以理解会执行下一个中间件
  bcrypt.genSalt(SALT_WORK_FACTOR, (err, salt) => {   // 加盐后，会有2个参数传递过来，一个是失败，一个似乎成功
    if (err) return next(err);
    bcrypt.hash(this.password, salt, (err, hash) => {   // 加密时，要将加盐成功的参数，传进去
      if (err) return next(err);
      this.password = hash;   // 在加盐和加密都没错误时，将最终结果替换原来数据的password字段
      next();
    })
  })
});

userSchema.methods = {    // 在Shema中制作一个比对的实例方法，让后代去调用
  // 密码比对的方法
  comparePassword: (_password, password) => {
    return new Promise((resolve, reject) => {
      bcrypt.compare(_password, password, (err, isMatch) => {
        if(!err) resolve(isMatch)
        else reject(err)
      })
    })
  }
}

// 发布模型
mongoose.model('user', userSchema, 'user');   // 将User表和userSchema连接在一起
